﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlCorso
    {
        Connector Connessione = Connector.Istance();

        public int Inserisci(Corso corso)
        {
            string query = "INSERT INTO Corsi(id,codice,datainizio,nome,numeroore) VALUES (@id, @codice, @datainizio, @nome, @numeroore)";
            SqlCommand insert = new SqlCommand(query, Connessione.Connessione);
            if (Connessione.Transaction != null)
                insert.Transaction = Connessione.Transaction;
            SqlParameter id = new SqlParameter();
            id.ParameterName = "@id";
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.Value = corso.Id;
            insert.Parameters.Add(id);

            SqlParameter codice = new SqlParameter();
            codice.ParameterName = "@codice";
            codice.SqlDbType = SqlDbType.NVarChar;
            codice.Value = corso.Codice;
            insert.Parameters.Add(codice);

            SqlParameter datainizio = new SqlParameter();
            datainizio.ParameterName = "@datainizio";
            datainizio.SqlDbType = SqlDbType.DateTime;
            datainizio.Value = corso.DataInizio;
            insert.Parameters.Add(datainizio);

            SqlParameter nome = new SqlParameter();
            nome.ParameterName = "@nome";
            nome.SqlDbType = SqlDbType.NVarChar;
            nome.Value = corso.Nome;
            insert.Parameters.Add(nome);

            SqlParameter numeroore = new SqlParameter();
            numeroore.ParameterName = "@numeroore";
            numeroore.SqlDbType = SqlDbType.Int;
            numeroore.Value = corso.NumeroOre;
            insert.Parameters.Add(numeroore);
            try
            {
                return insert.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new ImpossibileInserire();
            }
        }

        public int UpdateDataFine(Attivita attivita)
        {
            string sql = @"update Corsi SET
                datafine=@datafine
                where id=@id";
            try
            {
                SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
                if (Connessione.Transaction != null)
                    cmd.Transaction = Connessione.Transaction;

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = attivita.Corso.Id;
                cmd.Parameters.Add(id);

                /*calcolo la data di fine del corso in base alle ore scartando i festivi*/
                DateTime datafineCalcolata;
                DataTable dt = new DataTable();
                dt = new ctrlAttivitaDettaglio(null).Ricerca(" DettaglioAttivita.idattivita='" + attivita.Id
                    + "' ORDER BY DettaglioAttivita.Giorno DESC");
                datafineCalcolata = (DateTime)dt.Rows[0]["Giorno"];
                /*fine*/

                SqlParameter datafine = new SqlParameter();
                datafine.ParameterName = "@datafine";
                datafine.SqlDbType = SqlDbType.Date;
                datafine.Value = datafineCalcolata.Date;
                cmd.Parameters.Add(datafine);

                return cmd.ExecuteNonQuery();
            }
            catch { return -1; }
        }

        public int UpdateDataFineNULL(Corso corso)
        {
            string sql = @"update Corsi SET
                datafine=@datafine
                where id=@id";
            try
            {
                SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = corso.Id;
                cmd.Parameters.Add(id);

                SqlParameter datafine = new SqlParameter();
                datafine.ParameterName = "@datafine";
                datafine.Value = DBNull.Value;
                cmd.Parameters.Add(datafine);

                return cmd.ExecuteNonQuery();
            }
            catch { return -1; }
        }

        public void Update(Corso corso)
        {
            string query = "UPDATE Corsi SET codice = @codice, datainizio = @datainizio, nome = @nome, numeroore =  @numeroore "
                            + " WHERE id ='" + corso.Id + "'";
            SqlCommand update = new SqlCommand(query, Connessione.Connessione);

            SqlParameter codice = new SqlParameter();
            codice.ParameterName = "@codice";
            codice.SqlDbType = SqlDbType.NVarChar;
            codice.Value = corso.Codice;
            update.Parameters.Add(codice);

            SqlParameter datainizio = new SqlParameter();
            datainizio.ParameterName = "@datainizio";
            datainizio.SqlDbType = SqlDbType.DateTime;
            datainizio.Value = corso.DataInizio;
            update.Parameters.Add(datainizio);

            SqlParameter nome = new SqlParameter();
            nome.ParameterName = "@nome";
            nome.SqlDbType = SqlDbType.NVarChar;
            nome.Value = corso.Nome;
            update.Parameters.Add(nome);

            SqlParameter numeroore = new SqlParameter();
            numeroore.ParameterName = "@numeroore";
            numeroore.SqlDbType = SqlDbType.Int;
            numeroore.Value = corso.NumeroOre;
            update.Parameters.Add(numeroore);
            try
            {
                update.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new ImpossibileModificare();
            }
        }

        public int ControllaSeInAttività(Guid id)
        {
            DataTable data = new DataTable();
            string query = @"SELECT        Corsi.id
FROM            Attivita INNER JOIN
                         Corsi ON Attivita.idcorso = Corsi.id LEFT OUTER JOIN
                         DettaglioAttivita ON Attivita.id = DettaglioAttivita.idattivita
WHERE        (Attivita.idcorso = '" + id + @"')
GROUP BY Corsi.id";
            SqlDataAdapter sda = new SqlDataAdapter(query, Connessione.Connessione);
            sda.Fill(data);
            if (data.Rows.Count > 0)
                return 1;
            return 0;
        }

        public bool VerificaSeDataModificata(Corso corso)
        {
            string query = @"SELECT Corsi.datainizio AS DataInizio, Corsi.numeroore AS NumeroOre
                            FROM Corsi
                            WHERE Corsi.id =@Param1";
            DataTable table = new DataTable();

            SqlCommand select = new SqlCommand(query, Connessione.Connessione);
            SqlParameter id = new SqlParameter();
            id.ParameterName = "@Param1";
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.Value = corso.Id;
            select.Parameters.Add(id);
            SqlDataReader sdr = select.ExecuteReader();

            table.Load(sdr);

            if (table.Rows.Count > 0)
            {
                if ((DateTime)table.Rows[0]["DataInizio"] != corso.DataInizio || (int)table.Rows[0]["NumeroOre"] != corso.NumeroOre)
                    return true;
            }

            return false;
        }

        public Corso GetCorsoById(Guid id)
        {
            Corso corsoDaRitornare = new Corso();
            string query = " SELECT * FROM Corsi WHERE id = '" + id + "'";

            DataTable dataTable = new DataTable();

            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);
            if (dataTable.Rows.Count > 0)
            {
                corsoDaRitornare.Id = (Guid)dataTable.Rows[0]["id"];
                corsoDaRitornare.Nome = dataTable.Rows[0]["nome"].ToString();
                corsoDaRitornare.Codice = dataTable.Rows[0]["codice"].ToString();
                corsoDaRitornare.NumeroOre = (Int32)dataTable.Rows[0]["numeroore"];
                corsoDaRitornare.DataInizio = (DateTime)dataTable.Rows[0]["datainizio"];
                if (dataTable.Rows[0]["datafine"] != DBNull.Value)
                    corsoDaRitornare.DataFine = (DateTime)dataTable.Rows[0]["datafine"];
            }
            return corsoDaRitornare;
        }

        public List<Corso> SelectAllSenzaAttività()
        {
            List<Corso> corsiDaRitornare = new List<Corso>();
            string query = @" SELECT  Corsi.id As id, Corsi.nome AS nome, Corsi.codice AS codice,
                            Corsi.numeroore AS numeroore, Corsi.datainizio AS datainizio,
                            corsi.datafine AS datafine
               FROM         Attivita RIGHT OUTER JOIN
                            Corsi ON Attivita.idcorso = Corsi.id
               WHERE        (Attivita.idcorso IS NULL) ";
            DataTable dataTable = new DataTable();
            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);

            foreach (DataRow row in dataTable.Rows)
            {
                Corso corsoDaRitornare = new Corso();
                corsoDaRitornare.Id = (Guid)row["id"];
                corsoDaRitornare.Nome = row["nome"].ToString();
                corsoDaRitornare.Codice = row["codice"].ToString();
                corsoDaRitornare.NumeroOre = (Int32)row["numeroore"];
                corsoDaRitornare.DataInizio = (DateTime)row["datainizio"];
                if (row["datafine"] != DBNull.Value)
                    corsoDaRitornare.DataFine = (DateTime?)row["datafine"];
                else
                    corsoDaRitornare.DataFine = null;
                corsiDaRitornare.Add(corsoDaRitornare);
            }
            return corsiDaRitornare;
        }

        public List<Corso> SelectAllConAttività()
        {
            List<Corso> corsiDaRitornare = new List<Corso>();
            string query = @" SELECT  Corsi.id As id, Corsi.nome AS nome, Corsi.codice AS codice,
                            Corsi.numeroore AS numeroore, Corsi.datainizio AS datainizio,
                            corsi.datafine AS datafine
               FROM         Attivita RIGHT OUTER JOIN
                            Corsi ON Attivita.idcorso = Corsi.id
               WHERE        (Attivita.idcorso IS NOT NULL) ";
            DataTable dataTable = new DataTable();
            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);

            foreach (DataRow row in dataTable.Rows)
            {
                Corso corsoDaRitornare = new Corso();
                corsoDaRitornare.Id = (Guid)row["id"];
                corsoDaRitornare.Nome = row["nome"].ToString();
                corsoDaRitornare.Codice = row["codice"].ToString();
                corsoDaRitornare.NumeroOre = (Int32)row["numeroore"];
                corsoDaRitornare.DataInizio = (DateTime)row["datainizio"];
                if (row["datafine"] != DBNull.Value)
                    corsoDaRitornare.DataFine = (DateTime?)row["datafine"];
                else
                    corsoDaRitornare.DataFine = null;
                corsiDaRitornare.Add(corsoDaRitornare);
            }
            return corsiDaRitornare;
        }

        public List<Corso> SelectAll()
        {
            List<Corso> corsiDaRitornare = new List<Corso>();
            string query = " SELECT * FROM Corsi ";
            DataTable dataTable = new DataTable();
            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);

            foreach (DataRow row in dataTable.Rows)
            {
                Corso corsoDaRitornare = new Corso();
                corsoDaRitornare.Id = (Guid)row["id"];
                corsoDaRitornare.Nome = row["nome"].ToString();
                corsoDaRitornare.Codice = row["codice"].ToString();
                corsoDaRitornare.NumeroOre = (Int32)row["numeroore"];
                corsoDaRitornare.DataInizio = (DateTime)row["datainizio"];
                if (!string.IsNullOrWhiteSpace(row[5].ToString()))
                    corsoDaRitornare.DataFine = (DateTime?)row["datafine"];
                else
                    corsoDaRitornare.DataFine = null;
                corsiDaRitornare.Add(corsoDaRitornare);
            }
            return corsiDaRitornare;
        }

        public void Delete(Corso daCancellare)
        {
            string query = " DELETE FROM Corsi WHERE id = '" + daCancellare.Id + "'";
            SqlCommand elimina = new SqlCommand(query, Connessione.Connessione);
            try
            {
                elimina.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 547)
                    throw new CorsoAssociatoAdAttivita();
            }
        }

        public void DeleteById(Guid id)
        {
            string query = " DELETE FROM Corsi WHERE id = '" + id + "'";
            SqlCommand elimina = new SqlCommand(query, Connessione.Connessione);
            try
            {
                elimina.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 547)
                    throw new CorsoAssociatoAdAttivita();
            }
        }

        public int GetNumeroStanzaByIdCorso(Corso Corso)
        {
            string sql = @"SELECT  Stanze.numero AS Aula
                FROM  Corsi INNER JOIN
                    Attivita ON Corsi.id = Attivita.idcorso INNER JOIN
                    Stanze ON Attivita.idstanza = Stanze.id
                WHERE (Corsi.id = @condizione)";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@condizione", Corso.Id);

            return (int)cmd.ExecuteScalar();
        }

        public DateTime GetGiornoDopoValido(DateTime data)
        {
            if (data.DayOfWeek == DayOfWeek.Saturday && Properties.Settings.Default.chkConsideraSabato == false)
            { // Se il giorno è sabato e non è selezionato da Opzioni:
                if (Properties.Settings.Default.chkConsideraDomenica == false) // se è non è selezionato neaanche Domenica
                    return data.AddDays(2); // aggiungi due giorni
                else
                    return data.AddDays(1); // altrimenti aggiungi un giorno
            }
            else if (data.DayOfWeek == DayOfWeek.Sunday && Properties.Settings.Default.chkConsideraDomenica == false)
            { // altrimenti, se non è selezionato sabato e non è selezionato neanche domenica
                return data.AddDays(1); // aggiungi un solo giorno
            }
            return data;
        }
    }
}